package test;
import java.awt.AWTException;
import java.awt.Container;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import edu.cs320.project.DisplayController;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
public class SmartRobot extends Robot {
private static SmartRobot instance;
static {
try {
instance = new SmartRobot();
} catch (AWTException e) {
e.printStackTrace();
}
}
public static SmartRobot getInstance() {
return instance;
}
private SmartRobot() throws AWTException {
super();
}
public void keyType(int keyCode) {
keyPress(keyCode);
delay(50);
keyRelease(keyCode);
}
public void keyType(int keyCode, int keyCodeModifier) {
keyPress(keyCodeModifier);
keyPress(keyCode);
delay(50);
keyRelease(keyCode);
keyRelease(keyCodeModifier);
}
public void type(String text) {
int delay = this.getAutoDelay();
this.setAutoDelay(0);
for (int i=0; i<text.length(); ++i) {
typeChar(text.charAt(i));
}
this.setAutoDelay(delay);
}
private void typeChar(char c) {
boolean shift = true;
int keyCode;
switch (c) {
case 'A': keyCode = KeyEvent.VK_A; break;
case 'B': keyCode = KeyEvent.VK_B; break;
case 'C': keyCode = KeyEvent.VK_C; break;
case 'D': keyCode = KeyEvent.VK_D; break;
case 'E': keyCode = KeyEvent.VK_E; break;
case 'F': keyCode = KeyEvent.VK_F; break;
case 'G': keyCode = KeyEvent.VK_G; break;
case 'H': keyCode = KeyEvent.VK_H; break;
case 'I': keyCode = KeyEvent.VK_I; break;
case 'J': keyCode = KeyEvent.VK_J; break;
case 'K': keyCode = KeyEvent.VK_K; break;
case 'L': keyCode = KeyEvent.VK_L; break;
case 'M': keyCode = KeyEvent.VK_M; break;
case 'N': keyCode = KeyEvent.VK_N; break;
case 'O': keyCode = KeyEvent.VK_O; break;
case 'P': keyCode = KeyEvent.VK_P; break;
case 'Q': keyCode = KeyEvent.VK_Q; break;
case 'R': keyCode = KeyEvent.VK_R; break;
case 'S': keyCode = KeyEvent.VK_S; break;
case 'T': keyCode = KeyEvent.VK_T; break;
case 'U': keyCode = KeyEvent.VK_U; break;
case 'V': keyCode = KeyEvent.VK_V; break;
case 'W': keyCode = KeyEvent.VK_W; break;
case 'X': keyCode = KeyEvent.VK_X; break;
case 'Y': keyCode = KeyEvent.VK_Y; break;
case 'Z': keyCode = KeyEvent.VK_Z; break;
case '\n': shift = false;
case '\r': keyCode = KeyEvent.VK_ENTER; break;
case '~': keyCode = (int)'`'; break;
case '!': keyCode = (int)'1'; break;
case '@': keyCode = (int)'2'; break;
case '#': keyCode = (int)'3'; break;
case '$': keyCode = (int)'4'; break;
case '%': keyCode = (int)'5'; break;
case '^': keyCode = (int)'6'; break;
case '&': keyCode = (int)'7'; break;
case '*': keyCode = (int)'8'; break;
case '(': keyCode = (int)'9'; break;
case ')': keyCode = (int)'0'; break;
case ':': keyCode = (int)';'; break;
case '_': keyCode = (int)'-'; break;
case '+': keyCode = (int)'='; break;
case '|': keyCode = (int)'\\'; break;
case '?': keyCode = (int)'/'; break;
case '{': keyCode = (int)'['; break;
case '}': keyCode = (int)']'; break;
case '<': keyCode = (int)','; break;
case '>': keyCode = (int)'.'; break;
default:
keyCode = (int)Character.toUpperCase(c);
shift = false;
}
if (shift)
keyType(keyCode, KeyEvent.VK_SHIFT);
else
keyType(keyCode);
}
public void mouseClick(){
this.mousePress(KeyEvent.BUTTON1_MASK);
delay(50);
this.mouseRelease(KeyEvent.BUTTON1_MASK);
delay(50);
}
public void mouseClick(int x, int y){
this.mouseMove(x, y);
this.mousePress(KeyEvent.BUTTON1_MASK);
delay(50);
this.mouseRelease(KeyEvent.BUTTON1_MASK);
delay(50);
}
public void mouseClick(JComponent component){
Point center = this.calculateComponentCenter(component);
this.mouseMove(center.x, center.y);
delay(100);
this.mousePress(KeyEvent.BUTTON1_MASK);
delay(50);
this.mouseRelease(KeyEvent.BUTTON1_MASK);
delay(50);
}
public void scrollDown(JScrollBar scrollPane){
int x = scrollPane.getX() + scrollPane.getWidth() / 2;
int y = scrollPane.getY() + scrollPane.getHeight() - 4;
Container container = scrollPane;
while(container.getParent() != DisplayController.GetInstance() && container.getParent() != null){
container = container.getParent();
x += container.getX();
y += container.getY();
}
this.mouseTripleClick(x, y);
}
private Point calculateComponentCenter(JComponent component){
int x = component.getX() + component.getWidth() / 2;
int y = component.getY() + component.getHeight() / 2;
Container container = component;
while(container.getParent() != DisplayController.GetInstance() && container.getParent() != null){
container = container.getParent();
x += container.getX();
y += container.getY();
}
return new Point(x, y);
}
public void mouseDoubleClick(JComponent component) {
Point center = this.calculateComponentCenter(component);
this.mouseMove(center.x, center.y);
this.mouseClick();
delay(200);
this.mouseClick();
}
public void mouseTripleClick(JComponent component) {
this.mouseDoubleClick(component);
delay(200);
this.mouseClick();
}
public void mouseTripleClick() {
this.mouseDoubleClick();
delay(200);
this.mouseClick();
}
public void mouseTripleClick(int x, int y) {
this.mouseMove(x, y);
this.mouseTripleClick();
}
public void mouseDoubleClick(int x, int y) {
this.mouseMove(x + this.getXOffset(), y + this.getYOffset());
this.mouseClick();
delay(200);
this.mouseClick();
}
public void mouseDoubleClick() {
this.mouseClick();
delay(200);
this.mouseClick();
}
public void typeEnter() {
this.typeChar('\n');
}
public void typeDownArrow() {
this.keyType(KeyEvent.VK_DOWN);
}
public void typeUpArrow() {
this.keyType(KeyEvent.VK_UP);
}
private int getXOffset(){
DisplayController instance = DisplayController.GetInstance();
return instance.getXOnScreen();
}
private int getYOffset(){
DisplayController instance = DisplayController.GetInstance();
return instance.getYOnScreen();
}
}